readabilityes

Cálculo reproducible de métricas de legibilidad en español

Jesica Formoso

CIIPME-CONICET

Sofía Ortiz

CIIPME-CONICET

Brenda Gomez Muiño

Facultad de Psicología | UBA

Juan Pablo Barreyro

CIIPME-CONICET

¡Hola!👋 Soy Jésica

  • Psicóloga cognitiva, Dra. por la Universidad de Buenos Aires (UBA)
  • Investigadora de CONICET en el Centro Interdisciplinario de Investigaciones en Psicología Matemática y Experimental (CIIPME)
  • Co-organizadora de R-Ladies Buenos Aires y parte de R-Ladies global
  • Coordinadora de medicición de impacto en MetaDocencia

Equipo

Juan Pablo Barreyro
Dr. en Psicología, UBA
Investigador Independiente
CONICET

Sofía Ortiz
Lic. en Psicología, UBA
Becaria doctoral
CONICET

Brenda Gomez Muiño
Lic. en Psicología, UBA


¿Qué es la legibilidad?

  • Propiedad del texto que indica la facilidad con la que este puede ser comprendido por quien lo lee (Flesch, 1974)

  • Qué tan rápidamente y con cuánta comodidad una persona puede procesar el contenido.

No tiene la misma dificultad una oración breve y directa…

La programadora revisó el código antes de enviar la actualización.

que una en voz pasiva…

El código fue revisado antes de la actualización por la programadora.

..o que una oración más larga, con palabras de menor frecuencia, y una clausula infinita.

Después de haber depurado minuciosamente el módulo, que presentaba varias inconsistencias lógicas, la programadora elaboró un informe detallado.

¿Qué hace que un texto sea más difícil?

  • Complejidad léxica:

    • Palabras de baja frecuencia
    • Palabras polisilábicas
    • Gran diversidad en las palabras utilizadas
  • Complejidad sintáctica:

    • Oraciones extensas
    • Presencia de subordinadas

Índices de legibilidad

  • Buscan representar el grado de dificultad lingüística del texto mediante un número que sea fácil de calcular.

  • Intentan asociar el número con un nivel de dificultad y un nivel educativo particular.

Fórmula de Perpicuidad de Szigriszt y escala INFLESZ



\[ I = 206.835 - 62.3 \cdot \frac{\text{sílabas}}{\text{palabras}} - \frac{\text{palabras}}{\text{oraciones}} \]

Fórmula de Perpicuidad de Szigriszt y escala INFLESZ


Después de haber depurado minuciosamente el módulo, que presentaba varias inconsistencias lógicas, la programadora elaboró un informe detallado.

  • Cantidad de oraciones: 1

  • Cantidad de palabras: 18

  • Cantidad de sílabas: 52

  • Índice Flesch-Szigriszt: 8.86

  • Grado de dificultad según escala INFLESZ: Muy difícil

Fórmula de Perpicuidad de Szigriszt y escala INFLESZ


La maestra nos leyó un cuento.

  • Cantidad de oraciones: 1

  • Cantidad de palabras: 6

  • Cantidad de sílabas: 10

  • Índice Flesch-Szigriszt: 97

  • Grado de dificultad según escala INFLESZ: Muy fácil

¿Para qué se utilizan los índices de legibilidad?

Permiten evaluar y adaptar textos para que sean accesibles a audiencias con distintos niveles educativos o competencias lectoras.

Pueden aplicarse a múltiples áreas:

  • Educación
  • Medicina y salud pública
  • Ámbito legal y administrativo
  • Comunicación científica y divulgación

Dificultades para calcular legibilidad en español

  • Presenta particularidades fonológicas y ortográficas que dificultan la silibificación automática.
  • Ausencia de recursos libres, fáciles de integrar en R.

readabilityes

readabilityes (en desarrollo)

Objetivos:

  • Tener una herramienta para calcular métricas de legibilidad tradicionales, que utilice silibificación mediante reglas propias del español, sin necesidad de dependencias externas ni modelos descargables.
  • Que facilite la reproducibilidad de los análisis.
  • Que se integre de forma fluida con el ecosistema tidyverse.

Lógica de silibificación

  • Identificación de vocales fuertes, débiles y vocales tildadas.
  • Detección de diptongos y triptongos (considerando reglas de hiato por tilde en í/ú).
  • Localización de núcleos vocálicos consecutivos.
  • Aplicación de reglas consonánticas:
    • C+l / C+r no se separan.
    • Decisiones VC–CV, VCC–CV según el clúster.
  • Segmentación final por núcleos y clústeres.

Caso de uso

library(readabilityes)
library(tidyverse)

txt <- c("El mercado agrícola local abrió hoy con precios estables, aunque los productores expresaron cierta incertidumbre por los recientes cambios climáticos. Aun así, la cosecha de la semana pasada mostró buenos rendimientos y despertó expectativas moderadamente optimistas.",
         "El parque del barrio estaba lleno de familias que disfrutaban del sol. Los niños corrían entre los juegos mientras los adultos charlaban tranquilamente en los bancos.")

segment_sentences(txt)
[[1]]
[1] "El mercado agrícola local abrió hoy con precios estables, aunque los productores expresaron cierta incertidumbre por los recientes cambios climáticos."
[2] "Aun así, la cosecha de la semana pasada mostró buenos rendimientos y despertó expectativas moderadamente optimistas."                                  

[[2]]
[1] "El parque del barrio estaba lleno de familias que disfrutaban del sol."                         
[2] "Los niños corrían entre los juegos mientras los adultos charlaban tranquilamente en los bancos."

palabras <- tokenize_words(txt)
palabras[[1]]
 [1] "el"            "mercado"       "agrícola"      "local"        
 [5] "abrió"         "hoy"           "con"           "precios"      
 [9] "estables"      "aunque"        "los"           "productores"  
[13] "expresaron"    "cierta"        "incertidumbre" "por"          
[17] "los"           "recientes"     "cambios"       "climáticos"   
[21] "aun"           "así"           "la"            "cosecha"      
[25] "de"            "la"            "semana"        "pasada"       
[29] "mostró"        "buenos"        "rendimientos"  "y"            
[33] "despertó"      "expectativas"  "moderadamente" "optimistas"   

count_syllables(txt)
[1] 90 51
count_sentences(txt, drop_empty = TRUE)
[1] 2 2
avg_syllables_per_word(txt)
[1] 2.500000 1.961538
inflesz(txt)
     score    category
1 33.08500 Muy difícil
2 71.63115       Fácil

txt2 <- read_csv("textos.csv")

readability_summary(txt2) %>% 
  glimpse()
Rows: 10
Columns: 8
$ id_text             <chr> "saludo", "compra", "rutina", "estudio", "viaje", …
$ n_words             <int> 8, 10, 16, 19, 24, 31, 31, 41, 48, 44
$ n_syllables         <int> 15, 16, 34, 43, 51, 76, 87, 99, 105, 110
$ n_sentences         <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
$ szigriszt_pazos     <dbl> 82.0225000, 97.1550000, 58.4475000, 46.8402632, 50…
$ inflesz_score       <dbl> 82.0225000, 97.1550000, 58.4475000, 46.8402632, 50…
$ inflesz_category    <ord> Muy fácil, Muy fácil, Normal, Algo difícil, Algo d…
$ gutierrez_de_polini <dbl> 74.21250, 76.18000, 68.98750, 66.59737, 66.18750, …

readability_summary(txt2) %>% 
  mutate_if(is.numeric, round, 2) %>% 
  gt::gt()
id_text n_words n_syllables n_sentences szigriszt_pazos inflesz_score inflesz_category gutierrez_de_polini
saludo 8 15 1 82.02 82.02 Muy fácil 74.21
compra 10 16 1 97.16 97.16 Muy fácil 76.18
rutina 16 34 1 58.45 58.45 Normal 68.99
estudio 19 43 1 46.84 46.84 Algo difícil 66.60
viaje 24 51 1 50.45 50.45 Algo difícil 66.19
academico 31 76 1 23.10 23.10 Muy difícil 60.57
tecnologia 31 87 1 0.99 0.99 Muy difícil 57.13
politica 41 99 1 15.40 15.40 Muy difícil 57.43
historia 48 105 1 22.55 22.55 Muy difícil 57.18
ciencia 44 110 1 7.09 7.09 Muy difícil 55.55

readability_summary(txt2) %>% 
  summarise(Media_ifz = mean(inflesz_score),
            Longitud_media = mean(n_words),
            Longitud_minima = min(n_words),
            Logitud_maxima = max(n_words))
# A tibble: 1 × 4
  Media_ifz Longitud_media Longitud_minima Logitud_maxima
      <dbl>          <dbl>           <int>          <int>
1      40.4           27.2               8             48

readability_summary(txt2) %>%
  mutate(inflesz_category = 
           fct_relevel(inflesz_category, 
                       "Muy fácil",
                       "Normal",
                       "Algo difícil",
                       "Muy difícil")) %>%
  ggplot(aes(x = inflesz_category)) +
  geom_bar(fill = "#023e8a") +
  theme_minimal()

Próximos pasos

  • Incorporar análisis de vocabulario (frecuencia léxica).
  • Integración con anotadores gramaticales (udpipe).
  • Detección automática de estructuras sintácticas complejas.

¡Muchas gracias!